/**
  ******************************************************************************
  * @file    py32f4xx_hal_canfd.h
  * @author  MCU Application Team
  * @brief   Header file of CNAFD HAL module.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) Puya Semiconductor Co.
  * All rights reserved.</center></h2>
  *
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __PY32F4xx_HAL_CANFD_H
#define __PY32F4xx_HAL_CANFD_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "py32f4xx_hal_def.h"

#if defined ( __CC_ARM   )
#pragma anon_unions
#endif

/**
  * @brief HAL State structures definition
  */
typedef enum
{
  HAL_CANFD_STATE_RESET             = 0x00U,  /*!< CANFD not yet initialized or disabled */
  HAL_CANFD_STATE_READY             = 0x01U,  /*!< CANFD initialized and ready for use   */
  HAL_CANFD_STATE_BUSY              = 0x02U,  /*!< CANFD process is ongoing              */
  HAL_CANFD_STATE_LISTENING         = 0x03U,  /*!< CANFD receive process is ongoing      */
  HAL_CANFD_STATE_SLEEP_PENDING     = 0x04U,  /*!< CANFD sleep request is pending        */
  HAL_CANFD_STATE_SLEEP_ACTIVE      = 0x05U,  /*!< CANFD sleep mode is active            */
  HAL_CANFD_STATE_ERROR             = 0x06U   /*!< CANFD error state                     */
} HAL_CANFD_StateTypeDef;

/**
  * @brief CANFD LLC frame format Structure definition
  */
typedef struct
{
  uint32_t DLC:       11;
  uint32_t Reserved1: 5;
  uint32_t IDE:       1;
  uint32_t FDF:       1;
  uint32_t BRS:       1;
  uint32_t Reserved2: 1;
  uint32_t RMF:       1;
  uint32_t Reserved3: 3;
  uint32_t KOER:      3;
  uint32_t ESI:       1;
  uint32_t LBF:       1;
  uint32_t Reserved4: 3;
} CANFD_FormatfieldTypeDef;

/**
  * @brief CANFD Init Structure definition
  */
typedef struct
{
  uint32_t          FrameFormat;                  /*!< Specifies the CANFD frame format.
                                                       This parameter can be a value of @ref CANFD_frame_format     */
    
  uint32_t          Mode;                         /*!< Specifies the CAN operating mode.
                                                         This parameter can be a value of @ref CANFD_operating_mode */

  uint32_t          CANFDProtocol;                /*!< CAN-FD protocol, Bosch CAN-FD or 11898-1:2015 CAN-FD.
                                                         This parameter can be a value of @ref CANFD_FD_protocol */

  uint32_t          Prescaler;                    /*!< Specifies the value by which the oscillator frequency is
                                                         divided for generating the bit time quanta.
                                                         This parameter must be a number between Min_Data = 1 and Max_Data = 32. */

  uint32_t          NominalSyncJumpWidth;         /*!< Specifies the maximum number of time quanta the CANFD
                                                         hardware is allowed to lengthen or shorten a bit to perform
                                                         resynchronization.This parameter must be a number between 1 and 128 */

  uint32_t          NominalTimeSeg1;              /*!< Specifies the number of time quanta in Bit Segment 1.
                                                         This parameter must be a number between 2 and 513 */

  uint32_t          NominalTimeSeg2;              /*!< Specifies the number of time quanta in Bit Segment 2.
                                                         This parameter must be a number between 1 and 128 */

  uint32_t          DataSyncJumpWidth;            /*!< Specifies the maximum number of time quanta the CANFD
                                                         hardware is allowed to lengthen or shorten a data bit to
                                                         perform resynchronization.This parameter must be a number between 1 and 128 */

  uint32_t          DataTimeSeg1;                 /*!< Specifies the number of time quanta in Data Bit Segment 1.
                                                         This parameter must be a number between 2 and 257 */

  uint32_t          DataTimeSeg2;                 /*!< Specifies the number of time quanta in Data Bit Segment 2.
                                                         This parameter must be a number between 1 and 128 */

  uint32_t          SecondSamplePointOffset;      /*!< Specify secondary sample point(SSP) of transmitter delay compensatin(TDC). Number of TQ.
                                                         This parameter must be a number between 0 and 255 */
} CANFD_InitTypeDef;


/**
  * @brief  CANFD Tx header structure definition
  */
typedef struct
{
  uint32_t Identifier;          /*!< Specifies the identifier.
                                     This parameter must be a number between:
                                      - 0 and 0x7FF, if IdType is CANFD_STANDARD_ID
                                      - 0 and 0x1FFFFFFF, if IdType is CANFD_EXTENDED_ID               */

  uint32_t IdType;              /*!< Specifies the identifier type for the message that will be
                                     transmitted.
                                     This parameter can be a value of @ref CANFD_id_type               */

  uint32_t TxFrameType;         /*!< Specifies the frame type of the message that will be transmitted.
                                     This parameter can be a value of @ref CANFD_frame_type            */

  
  uint32_t FrameFormat;         /*!< Specifies whether the Rx frame is received in classic or FD
                                       format.
                                       This parameter can be a value of @ref CANFD_frame_format                */

  uint32_t Handle;              /*!< Specifies handle for frame identifiation.
                                       This parameter must be a number between 0 and 0xFF              */

  uint32_t DataLength;          /*!< Specifies the length of the frame that will be transmitted.
                                      This parameter can be a value of @ref CANFD_data_length_code     */
} CANFD_TxHeaderTypeDef;


/**
  * @brief  CANFD Rx header structure definition
  */
typedef struct
{
  uint32_t Identifier;            /*!< Specifies the identifier.
                                       This parameter must be a number between:
                                        - 0 and 0x7FF, if IdType is CANFD_STANDARD_ID
                                        - 0 and 0x1FFFFFFF, if IdType is CANFD_EXTENDED_ID               */

  uint32_t IdType;                /*!< Specifies the identifier type of the received message.
                                       This parameter can be a value of @ref CANFD_id_type               */

  uint32_t RxFrameType;           /*!< Specifies the the received message frame type.
                                       This parameter can be a value of @ref CANFD_frame_type            */

  uint32_t DataLength;            /*!< Specifies the received frame length.
                                        This parameter can be a value of @ref CANFD_data_length_code     */

  uint32_t ErrorStateIndicator;   /*!< Specifies the error state indicator.
                                       This parameter can be a value of @ref CANFD_error_state_indicator */

  uint32_t ProtocolErrorType;     /*!< Specifies CAN frame error type. 
                                       This parameter can be a value of @ref CANFD_protocol_error_type      */

  uint32_t LoopBackIndicator;     /*!< Specifies CANFD loop back frame
                                       This parameter can be a value of @ref CANFD_loopback_frame         */

  uint32_t FrameFormat;           /*!< Specifies whether the Rx frame is received in classic or FD format.
                                       This parameter can be a value of @ref CANFD_frame_format                */

  uint32_t RxTimestamp;           /*!< Specifies the timestamp counter value captured on start of frame reception.
                                       This parameter must be a number between 0 and 0xFFFF              */

} CANFD_RxHeaderTypeDef;

/**
  * @brief CANFD filter Structure definition
  */
typedef struct
{
  uint32_t IdType;                            /*!< Specifies the identifier type.
                                                   This parameter can be a value of @ref CANFD_id_type       */
                                              
  uint32_t FilterChannel;                     /*!< Specify acceptance filter channel.
                                                   This parameter can be values of @ref CANFD_filter_channel */
                                              
  uint32_t Rank;                              /*!< Add or remove the channel from filter group.
                                                   This parameter can be a value of @ref CANFD_filter_rank */
                                              
  uint32_t FilterID;                          /*!< Specifies the filter identification.
                                                     This parameter must be a number between:
                                                      - 0 and 0x7FF, if IdType is CANFD_STANDARD_ID
                                                      - 0 and 0x1FFFFFFF, if IdType is CANFD_EXTENDED_ID       */
  union{                                      
    uint32_t FilterFormat;                    /*!< Specifies the filter format.
                                                   This parameter can be a value of @ref CANFD_LLC_FORMAT_BITS */
    CANFD_FormatfieldTypeDef FilterFormat_f;
  };
  
  uint32_t MaskID;                            /*!< Specifies the filter mask identification.
                                                     This parameter must be a number between:
                                                      - 0 and 0x7FF, if IdType is CANFD_STANDARD_ID
                                                      - 0 and 0x1FFFFFFF, if IdType is CANFD_EXTENDED_ID       */
                                              
  union{                                      
    uint32_t MaskFormat;                      /*!< Specifies the mask format. 
                                                   This parameter can be a value of @ref CANFD_LLC_FORMAT_BITS */
    CANFD_FormatfieldTypeDef MaskFormat_f;
  };

} CANFD_FilterTypeDef;

/**
 * @brief CAN time-triggered communication configuration structure.
 */
typedef struct
{

  uint32_t FifoMode;                 /*!< Specifies the TTCAN Mode.
                                           This parameter can be a value of @ref CANFD_TTCAN_FIFO_mode            */

  uint32_t Prescaler;                /*!< Specifies the Timestamp prescaler.
                                           This parameter can be a value of @ref CANFD_timestamp_prescaler   */

  uint32_t RefMessageIdType;         /*!< Specifies the identifier type of the reference message.
                                           This parameter can be a value of @ref CANFD_id_type               */

  uint32_t RefMessageId;             /*!< Specifies the identifier.
                                         This parameter must be a number between:
                                          - 0 and 0x7FF, if IdType is CANFD_STANDARD_ID
                                          - 0 and 0x1FFFFFFF, if IdType is CANFD_EXTENDED_ID               */

  uint32_t TxEnableWindow;           /*!< Specifies the Transmit Enable Window.
                                           This parameter must be a number between 1 and 15           */

  uint32_t WatchTrigTime;            /*!< Specifies the Application Watchdog Limit.
                                           This parameter must be a number between 0 and 0xFFFF              */

} CANFD_TimeTriggerTypeDef;

/**
  * @brief CANFD Protocol Status structure definition
  */
typedef struct
{
  uint32_t TxErrorCnt;        /*!< Specifies the Transmit Error Counter Value.
                                   This parameter can be a number between 0 and 255                                          */

  uint32_t RxErrorCnt;        /*!< Specifies the Receive Error Counter Value.
                                   This parameter can be a number between 0 and 255                                          */
  
  uint32_t LastErrorCode;     /*!< Specifies the type of the last error that occurred on the CANFD bus.
                                   This parameter can be a value of @ref CANFD_protocol_error_type                           */
  
  uint32_t LastArbLostPos;    /*!< Specifies the position of the last arbitration lost on the CANFD bus. 
                                   This parameter can be a number between 0 and 31                                           */

  uint32_t ErrorPassive;      /*!< Specifies the CANFD module error status.
                                   This parameter can be:
                                    - 0 : The CANFD is in Error_Active state
                                    - 1 : The CANFD is in Error_Passive state                                                */

  uint32_t Warning;           /*!< Specifies the CANFD module warning status.
                                   This parameter can be:
                                    - 0 : error counters (RxErrorCnt and TxErrorCnt) are below the Error_Warning limit
                                    - 1 : at least one of error counters has reached the Error_Warning limit          */

  uint32_t BusOff;            /*!< Specifies the CANFD module Bus_Off status.
                                   This parameter can be:
                                    - 0 : The CANFD is not in Bus_Off state
                                    - 1 : The CANFD is in Bus_Off state                                                      */

} CANFD_ProtocolStatusTypeDef;

/**
  * @brief CANFD transmit status Structure definition
  */
typedef struct
{
  uint32_t LastTxHandle;     /*!< Specifies the handle value of the last Tx frame.
                                  This parameter can be a number between 0 and 255                                           */
  
  uint32_t LastTxStatus;     /*!< Specifies the status of the last Tx frame.
                                  This parameter can be a value of @ref CANFD_transmit_status                                */
  
  uint32_t TxHandle;         /*!< Specifies the handle value of the current Tx frame.
                                  This parameter can be a number between 0 and 255                                           */

  uint32_t TxStatus;         /*!< Specifies the status of the current Tx frame.
                                  This parameter can be a value of @ref CANFD_transmit_status                                */
  
} CANFD_TxStatusTypeDef;


#if USE_HAL_CANFD_REGISTER_CALLBACKS == 1
typedef struct __CANFD_HandleTypeDef
#else
typedef struct
#endif /* USE_HAL_CANFD_REGISTER_CALLBACKS */
{
  CANFD_TypeDef                 *Instance;                 /*!< Register base address */

  CANFD_InitTypeDef             Init;                      /*!< CANFD required parameters */

  __IO HAL_CANFD_StateTypeDef   State;                     /*!< CANFD communication state */

  HAL_LockTypeDef               Lock;                      /*!< CANFD locking object      */

  __IO uint32_t                 ErrorCode;                 /*!< CANFD Error code. */

  uint32_t                      LastTimeTrigType;          /*!< CANFD last time trig type */

  uint32_t                      LastAbortTxType;           /*!< CANFD last abort transmit type */

  uint32_t                      LastSTBTxType;             /*!< CANFD last STB transmit type */

#if USE_HAL_CANFD_REGISTER_CALLBACKS == 1
  void (* RxCpltCallback)(__CANFD_HandleTypeDef *hcan);
  void (* RxFifoAlmostFullCallback)(__CANFD_HandleTypeDef *hcan);
  void (* RxFifoFullCallback)(__CANFD_HandleTypeDef *hcan);
  void (* PtbTxCpltCallback)(__CANFD_HandleTypeDef *hcan);
  void (* StbTxCpltCallback)(__CANFD_HandleTypeDef *hcan, uint32_t LastSTBTxType);
  void (* RxFifoOverflowCallback)(__CANFD_HandleTypeDef *hcan);
  void (* ArbitrationLostCallback)(__CANFD_HandleTypeDef *hcan);
  void (* TxAbortCallback)(__CANFD_HandleTypeDef *hcan, uint32_t LastAbortTxType);
  void (* PassiveErrorCallback)(__CANFD_HandleTypeDef *hcan);
  void (* BusErrorCallback)(__CANFD_HandleTypeDef *hcan);
  void (* ErrorChangeCallback)(__CANFD_HandleTypeDef *hcan);
  void (* TT_RxTimeTrigCallback)(__CANFD_HandleTypeDef *hcan);
  void (* TT_TxSingleTrigCallback)(__CANFD_HandleTypeDef *hcan);
  void (* TT_TxStartTrigCallback)(__CANFD_HandleTypeDef *hcan);
  void (* TT_TxStopTrigCallback)(__CANFD_HandleTypeDef *hcan);
  void (* TT_TimestampWraparoundCallback)(__CANFD_HandleTypeDef *hcan);
  void (* TT_TrigErrorCallback)(__CANFD_HandleTypeDef *hcan);  
  
  void (* MspInitCallback)(struct __CANFD_HandleTypeDef *hfdcan);                     /*!< CANFD Msp Init callback              */
  void (* MspDeInitCallback)(struct __CANFD_HandleTypeDef *hfdcan);                   /*!< CANFD Msp DeInit callback            */
#endif /* USE_HAL_CANFD_REGISTER_CALLBACKS */

} CANFD_HandleTypeDef;

#if USE_HAL_CANFD_REGISTER_CALLBACKS == 1
/**
  * @brief  HAL CANFD common Callback ID enumeration definition
  */
typedef enum
{
  HAL_CANFD_RX_COMPLETE_CB_ID             = 0x00U,    /*!< CANFD Rx complete callback ID                */
  HAL_CANFD_RX_FIFO_ALMOST_FULL_CB_ID     = 0x01U,    /*!< CANFD Rx fifo almost full callback ID        */
  HAL_CANFD_RX_FIFO_FULL_CB_ID            = 0x02U,    /*!< CANFD Rx fifo full callback ID               */
  HAL_CANFD_PTB_TX_COMPLETE_CB_ID         = 0x03U,    /*!< CANFD PTB Tx complete callback ID            */
  HAL_CANFD_STB_TX_COMPLETE_CB_ID         = 0x04U,    /*!< CANFD STB Tx complete callback ID            */
  HAL_CANFD_TX_ABORT_CB_ID                = 0x05U,    /*!< CANFD Tx abort callback ID                   */
  HAL_CANFD_RX_FIFO_OVERFLOW_CB_ID        = 0x06U,    /*!< CANFD Rx fifo overflow callback ID           */
  HAL_CANFD_ARBITRATION_LOST_CB_ID        = 0x07U,    /*!< CANFD Arbitration lost callback ID           */

  HAL_CANFD_PASSIVE_ERROR_CB_ID           = 0x08U,    /*!< CANFD Passive error callback ID              */
  HAL_CANFD_BUS_ERROR_CB_ID               = 0x09U,    /*!< CANFD Bus error callback ID                  */
  HAL_CANFD_ERROR_CHANGE_CB_ID            = 0x0AU,    /*!< CANFD Error change callback ID               */

  HAL_CANFD_TT_RX_TIME_TRIG_CB_ID         = 0x0BU,    /*!< CANFD TT Rx time trig callback ID            */
  HAL_CANFD_TT_TX_SINGLE_TRIG_CB_ID       = 0x0CU,    /*!< CANFD TT Tx single trig callback ID          */
  HAL_CANFD_TT_TX_START_TRIG_CB_ID        = 0x0DU,    /*!< CANFD TT Tx start trig callback ID           */
  HAL_CANFD_TT_TX_STOP_TRIG_CB_ID         = 0x0EU,    /*!< CANFD TT Tx stop trig callback ID            */
  HAL_CANFD_TT_TIMESTAMP_WRAPAROUND_CB_ID = 0x0FU,    /*!< CANFD TT timestamp wraparound callback ID    */

  HAL_CANFD_TT_TRIG_ERROR_CB_ID           = 0x10U,    /*!< CANFD TT trig error callback ID              */

  HAL_CANFD_MSPINIT_CB_ID                 = 0x11U,    /*!< CANFD MspInit callback ID                    */
  HAL_CANFD_MSPDEINIT_CB_ID               = 0x12U,    /*!< CANFD MspDeInit callback ID                  */

} HAL_CANFD_CallbackIDTypeDef;

/**
  * @brief  HAL CANFD Callback pointer definition
  */
typedef  void (*pCANFD_CallbackTypeDef)(CANFD_HandleTypeDef *hcanfd);     /*!< pointer to a common CANfd callback function */

#endif /* USE_HAL_CANFD_REGISTER_CALLBACKS */

/** @defgroup HAL_CANFD_Error_Code HAL CANFD Error Code
  * @{
  */
#define HAL_CANFD_ERROR_NONE            ((uint32_t)0x00000000U) /*!< No error                                                               */
#define HAL_CANFD_ERROR_TIMEOUT         ((uint32_t)0x00000001U) /*!< Timeout error                                                          */
#define HAL_CANFD_ERROR_NOT_INITIALIZED ((uint32_t)0x00000002U) /*!< Peripheral not initialized                                             */
#define HAL_CANFD_ERROR_NOT_READY       ((uint32_t)0x00000004U) /*!< Peripheral not ready                                                   */
#define HAL_CANFD_ERROR_NOT_STARTED     ((uint32_t)0x00000008U) /*!< Peripheral not started                                                 */
#define HAL_CANFD_ERROR_NOT_SUPPORTED   ((uint32_t)0x00000010U) /*!< Mode not supported                                                     */
#define HAL_CANFD_ERROR_PARAM           ((uint32_t)0x00000020U) /*!< Parameter error                                                        */
#define HAL_CANFD_ERROR_PENDING         ((uint32_t)0x00000040U) /*!< Pending operation                                                      */
#define HAL_CANFD_ERROR_RAM_ACCESS      ((uint32_t)0x00000080U) /*!< Message RAM Access Failure                                             */
#define HAL_CANFD_ERROR_FIFO_EMPTY      ((uint32_t)0x00000100U) /*!< Get element from empty FIFO                                            */
#define HAL_CANFD_ERROR_FIFO_FULL       ((uint32_t)0x00000200U) /*!< Put element in full FIFO                                               */

#if USE_HAL_CANFD_REGISTER_CALLBACKS == 1
#define HAL_CANFD_ERROR_INVALID_CALLBACK ((uint32_t)0x00000400U) /*!< Invalid Callback error                                                */
#endif /* USE_HAL_CANFD_REGISTER_CALLBACKS */
/**
  * @}
  */
  
/** @defgroup CANFD_frame_format CANFD Frame Format
  * @{
  */
#define CANFD_FRAME_CLASSIC   ((uint32_t)0x00000000U)                     /*!< Classic mode                      */
#define CANFD_FRAME_FD_NO_BRS ((uint32_t)0x00020000U)                     /*!< FD mode without BitRate Switching */
#define CANFD_FRAME_FD_BRS    ((uint32_t)(0x00020000U | 0x00040000U))     /*!< FD mode with BitRate Switching    */
/**
  * @}
  */

/** @defgroup CANFD_data_length_code CANFD Data Length Code
  * @{
  */
#define CANFD_DLC_BYTES_0              ((uint32_t)0x00000000U) /*!< 0 bytes data field  */
#define CANFD_DLC_BYTES_1              ((uint32_t)0x00000001U) /*!< 1 bytes data field  */
#define CANFD_DLC_BYTES_2              ((uint32_t)0x00000002U) /*!< 2 bytes data field  */
#define CANFD_DLC_BYTES_3              ((uint32_t)0x00000003U) /*!< 3 bytes data field  */
#define CANFD_DLC_BYTES_4              ((uint32_t)0x00000004U) /*!< 4 bytes data field  */
#define CANFD_DLC_BYTES_5              ((uint32_t)0x00000005U) /*!< 5 bytes data field  */
#define CANFD_DLC_BYTES_6              ((uint32_t)0x00000006U) /*!< 6 bytes data field  */
#define CANFD_DLC_BYTES_7              ((uint32_t)0x00000007U) /*!< 7 bytes data field  */
#define CANFD_DLC_BYTES_8              ((uint32_t)0x00000008U) /*!< 8 bytes data field  */
#define CANFD_DLC_BYTES_12             ((uint32_t)0x00000009U) /*!< 12 bytes data field */
#define CANFD_DLC_BYTES_16             ((uint32_t)0x0000000AU) /*!< 16 bytes data field */
#define CANFD_DLC_BYTES_20             ((uint32_t)0x0000000BU) /*!< 20 bytes data field */
#define CANFD_DLC_BYTES_24             ((uint32_t)0x0000000CU) /*!< 24 bytes data field */
#define CANFD_DLC_BYTES_32             ((uint32_t)0x0000000DU) /*!< 32 bytes data field */
#define CANFD_DLC_BYTES_48             ((uint32_t)0x0000000EU) /*!< 48 bytes data field */
#define CANFD_DLC_BYTES_64             ((uint32_t)0x0000000FU) /*!< 64 bytes data field */
/**
  * @}
  */

/** @defgroup CANFD_LLC_FORMAT_BITS CANFD LLC format bits
  * @{
  */
#define CANFD_LLC_FORMAT_DLC_0         ((uint32_t)0x00000001U)         /*!< BIT DLC_0  */
#define CANFD_LLC_FORMAT_DLC_1         ((uint32_t)0x00000002U)         /*!< BIT DLC_1  */
#define CANFD_LLC_FORMAT_DLC_2         ((uint32_t)0x00000004U)         /*!< BIT DLC_2  */
#define CANFD_LLC_FORMAT_DLC_3         ((uint32_t)0x00000008U)         /*!< BIT DLC_3  */
#define CANFD_LLC_FORMAT_IDE           ((uint32_t)0x00010000U)         /*!< BIT IDE    */
#define CANFD_LLC_FORMAT_FDF           ((uint32_t)0x00020000U)         /*!< BIT FDF    */
#define CANFD_LLC_FORMAT_BRS           ((uint32_t)0x00040000U)         /*!< BIT BRS    */
#define CANFD_LLC_FORMAT_RMF           ((uint32_t)0x00100000U)         /*!< BIT RMF    */
#define CANFD_LLC_FORMAT_KOER_0        ((uint32_t)0x01000000U)         /*!< BIT KOER_0 */
#define CANFD_LLC_FORMAT_KOER_1        ((uint32_t)0x02000000U)         /*!< BIT KOER_1 */
#define CANFD_LLC_FORMAT_KOER_2        ((uint32_t)0x04000000U)         /*!< BIT KOER_2 */
#define CANFD_LLC_FORMAT_ESI           ((uint32_t)0x08000000U)         /*!< BIT ESI    */
#define CANFD_LLC_FORMAT_LBF           ((uint32_t)0x10000000U)         /*!< BIT LBF    */

#define CANFD_LLC_FORMAT_DLC           ((uint32_t)0x0000000FU)         /*!< BIT DLC    */
#define CANFD_LLC_FORMAT_KOER          ((uint32_t)0x07000000U)         /*!< BIT KOER   */

#define CANFD_LLC_FORMAT_KOER_Pos      (24)                            /*!< BIT KOER Pos   */
/**
  * @}
  */

/** @defgroup CANFD_id_type CANFD id type
  * @{
  */
#define CANFD_STANDARD_ID            ((uint32_t)0x00000000U)         /*!< Standard ID element */
#define CANFD_EXTENDED_ID            ((uint32_t)0x00010000U)         /*!< Extended ID element */
/**
  * @}
  */

/** @defgroup CANFD_format CAN Frame Format
  * @{
  */
#define CANFD_CLASSIC_CAN            ((uint32_t)0x00000000U)         /*!< Classic frame      */
#define CANFD_FD_CAN                 ((uint32_t)0x00020000U)         /*!< FD frame           */
/**
  * @}
  */

/** @defgroup CANFD_bit_rate_switching CANFD Bit Rate Switching
  * @{
  */
#define CANFD_BRS_OFF        ((uint32_t)0x00000000U)          /*!< FD mode without BitRate Switching */
#define CANFD_BRS_ON         ((uint32_t)0x00040000U)          /*!< FD mode with BitRate Switching    */
/**
  * @}
  */

/** @defgroup CANFD_frame_type CAN frame type
  * @{
  */
#define CANFD_DATA_FRAME                   ((uint32_t)0x00000000U)         /*!< data frame        */
#define CANFD_REMOTE_FRAME                 ((uint32_t)0x00100000U)         /*!< remote frame      */
/**
  * @}
  */

/** @defgroup CANFD_protocol_error_type CAN frame error type
  * @{
  */
#define CANFD_PROTOCOL_NONE_ERROR             ((uint32_t)0x00000000U)         /*!< no error                     */
#define CANFD_PROTOCOL_BIT_ERROR              ((uint32_t)0x00000001U)         /*!< frame bit error              */
#define CANFD_PROTOCOL_FORM_ERROR             ((uint32_t)0x00000002U)         /*!< frame form error             */
#define CANFD_PROTOCOL_STUFF_ERROR            ((uint32_t)0x00000003U)         /*!< frame bit sruff error        */
#define CANFD_PROTOCOL_ACK_ERROR              ((uint32_t)0x00000004U)         /*!< frame ack error              */
#define CANFD_PROTOCOL_CRC_ERROR              ((uint32_t)0x00000005U)         /*!< all stored data are invalid  */
#define CANFD_PROTOCOL_OTHER_ERROR            ((uint32_t)0x00000006U)         /*!< OTHER ERROR  */
/**
  * @}
  */

/** @defgroup CANFD_error_state_indicator CANFD Error State Indicator
  * @{
  */
#define CANFD_ESI_ACTIVE            ((uint32_t)0x00000000U)         /*!< CANFD node is error active     */
#define CANFD_ESI_PASSIVE           ((uint32_t)0x08000000U)         /*!< CANFD node is error passive    */
/**
  * @}
  */

/** @defgroup CANFD_loopback_frame CANFD loop back frame
  * @{
  */
#define CANFD_LOOPBACK_FRAME_ON         ((uint32_t)0x00000000U)         /*!< CANFD receive frame is LoopBack frame     */
#define CANFD_LOOPBACK_FRAME_OFF        ((uint32_t)0x10000000U)         /*!< CANFD receive frame is not LoopBack frame */
/**
  * @}
  */

/** @defgroup CANFD_operating_mode CAN Operating Mode
* @{
*/
#define CANFD_MODE_NORMAL                (0x00000000U)                                  /*!< Normal mode   */
#define CANFD_MODE_RESTRICTED_OPERATION  ((uint32_t)CANFD_TSNCR_ROP)                    /*!< Restricted operation mode */
#define CANFD_MODE_LOOPBACK_EXT_NOACK    ((uint32_t)CANFD_MCR_LBME)                     /*!< Loopback mode */
#define CANFD_MODE_LOOPBACK_EXT_ACK      ((uint32_t)(CANFD_MCR_LBME | CANFD_MCR_SACK))  /*!< Loopback mode */
#define CANFD_MODE_LOOPBACK_INT          ((uint32_t)CANFD_MCR_LBMI)                     /*!< Loopback mode */
#define CANFD_MODE_SILENT                ((uint32_t)CANFD_MCR_LOM)                      /*!< Silent mode   */
#define CANFD_MODE_SILENT_LOOPBACK       ((uint32_t)(CANFD_MCR_LOM | CANFD_MCR_LBME))   /*!< Loopback combined with silent mode */
/**
  * @}
  */

/** @defgroup CANFD_retransmission_Limit CANFD Retransmission Limit
* @{
*/
#define CANFD_AUTO_RETRANSMISSION_1TRANSFER           (0x00000000U)
#define CANFD_AUTO_RETRANSMISSION_2TRANSFERS          ((uint32_t)CANFD_RLSSP_RETLIM_0)
#define CANFD_AUTO_RETRANSMISSION_3TRANSFERS          ((uint32_t)CANFD_RLSSP_RETLIM_1)
#define CANFD_AUTO_RETRANSMISSION_4TRANSFERS          ((uint32_t)(CANFD_RLSSP_RETLIM_0|CANFD_RLSSP_RETLIM_1))
#define CANFD_AUTO_RETRANSMISSION_5TRANSFERS          ((uint32_t)CANFD_RLSSP_RETLIM_2)
#define CANFD_AUTO_RETRANSMISSION_6TRANSFERS          ((uint32_t)(CANFD_RLSSP_RETLIM_0 | CANFD_RLSSP_RETLIM_2))
#define CANFD_AUTO_RETRANSMISSION_7TRANSFERS          ((uint32_t)(CANFD_RLSSP_RETLIM_1 | CANFD_RLSSP_RETLIM_2))
#define CANFD_AUTO_RETRANSMISSION_NO_LIMIT            ((uint32_t)(CANFD_RLSSP_RETLIM_0 | CANFD_RLSSP_RETLIM_1 | CANFD_RLSSP_RETLIM_2))
/**
  * @}
  */

/** @defgroup CANFD_rearbitration_Limit CANFD Rearbitration Limit
* @{
*/
#define CANFD_AUTO_REARBITRATION_1TRANSFER           (0x00000000U)
#define CANFD_AUTO_REARBITRATION_2TRANSFERS          ((uint32_t)CANFD_RLSSP_REALIM_0)
#define CANFD_AUTO_REARBITRATION_3TRANSFERS          ((uint32_t)CANFD_RLSSP_REALIM_1)
#define CANFD_AUTO_REARBITRATION_4TRANSFERS          ((uint32_t)(CANFD_RLSSP_REALIM_0|CANFD_RLSSP_REALIM_1))
#define CANFD_AUTO_REARBITRATION_5TRANSFERS          ((uint32_t)CANFD_RLSSP_REALIM_2)
#define CANFD_AUTO_REARBITRATION_6TRANSFERS          ((uint32_t)(CANFD_RLSSP_REALIM_0 | CANFD_RLSSP_REALIM_2))
#define CANFD_AUTO_REARBITRATION_7TRANSFERS          ((uint32_t)(CANFD_RLSSP_REALIM_1 | CANFD_RLSSP_REALIM_2))
#define CANFD_AUTO_REARBITRATION_NO_LIMIT            ((uint32_t)(CANFD_RLSSP_REALIM_0 | CANFD_RLSSP_REALIM_1 | CANFD_RLSSP_REALIM_2))
/**
  * @}
  */
  
/** @defgroup CANFD_RX_FIFO_threshold CANFD receive fifo almost full warning limit.
* @{
*/
#define CANFD_RX_FIFO_THRESHOLD_1SLOT          ((uint32_t)CANFD_WECR_AFWL_0)
#define CANFD_RX_FIFO_THRESHOLD_2SLOTS         ((uint32_t)CANFD_WECR_AFWL_1)
#define CANFD_RX_FIFO_THRESHOLD_3SLOTS         ((uint32_t)(CANFD_WECR_AFWL_0 | CANFD_WECR_AFWL_1))
/**
  * @}
  */
  
/**
 * @defgroup CANFD_FD_protocol CAN FD Protocol
 * @{
 */
#define CANFD_FD_BOSCH               (0x00000000U)
#define CANFD_FD_ISO_11898           (CANFD_MCR_FD_ISO)
/**
 * @}
 */

/**
 * @defgroup CANFD_transmit_mode CAN transmit Mode
 * @{
 */
#define CANFD_TXFIFO_PTB_SEND            (0x00000001U)
#define CANFD_TXFIFO_STB_SEND_ONE        (0x00000002U)
#define CANFD_TXFIFO_STB_SEND_ALL        (0x00000004U)
/**
 * @}
 */

/**
* @defgroup CANFD_filter_channel CAN Acceptance Channel
* @{
*/
#define CANFD_FILTER_CHANNEL_0           (0x00000000U)
#define CANFD_FILTER_CHANNEL_1           (0x00000001U)
#define CANFD_FILTER_CHANNEL_2           (0x00000002U)
#define CANFD_FILTER_CHANNEL_3           (0x00000003U)
#define CANFD_FILTER_CHANNEL_4           (0x00000004U)
#define CANFD_FILTER_CHANNEL_5           (0x00000005U)
#define CANFD_FILTER_CHANNEL_6           (0x00000006U)
#define CANFD_FILTER_CHANNEL_7           (0x00000007U)
#define CANFD_FILTER_CHANNEL_8           (0x00000008U)
#define CANFD_FILTER_CHANNEL_9           (0x00000009U)
#define CANFD_FILTER_CHANNEL_10          (0x0000000AU)
#define CANFD_FILTER_CHANNEL_11          (0x0000000BU)
/**
 * @}
 */

/** @defgroup CANFD_filter_rank CAN Filter rank
  * @{
  */
#define CANFD_FILTER_RANK_CHANNEL_NUMBER (0x00000000U)  /*!< Enable the rank of the selected channels.  */
#define CANFD_FILTER_RANK_NONE           (0x00000001U)  /*!< Disable the selected rank (selected channel).  */
/**
  * @}
  */

/**
 * @defgroup CANFD_RX_FIFO_overflow_mode CAN Receive Buffer Overflow Mode
 * @{
 */
#define CANFD_RX_FIFO_OVERWRITE          (0x00000000U)    /*!< Rx FIFO overwrite mode */
#define CANFD_RX_FIFO_BLOCKING           (CANFD_MCR_ROM)   /*!< Rx FIFO blocking mode  */
/**
 * @}
 */

/**
 * @defgroup CANFD_receive_fifo_state CAN Receive Buffer Overflow Mode
 * @{
 */
#define CANFD_RX_FIFO_EMPTY                    (0x00000000U)                           /*!< Rx FIFO empty  */
#define CANFD_RX_FIFO_LE_AFWL                  (CANFD_MCR_RSTAT_0)                     /*!< Rx FIFO more than empty and less than almost full (AFWL) */
#define CANFD_RX_FIFO_GT_AFWL                  (CANFD_MCR_RSTAT_1)                     /*!< Rx FIFO Greater than or equal to almost full */
#define CANFD_RX_FIFO_FULL                     (CANFD_MCR_RSTAT_0 | CANFD_MCR_RSTAT_1) /*!< Rx FIFO full */
/**
 * @}
 */

/**
 * @defgroup CANFD_receive_fifo_state CAN Receive Buffer Overflow Mode
 * @{
 */
#define CANFD_STB_FIFO_EMPTY                  (0x00000000U)   /*!< STB FIFO empty  */
#define CANFD_STB_FIFO_LE_HF                  (CANFD_MCR_TSSTAT_0)   /*!< STB FIFO less than or equal to half full */
#define CANFD_STB_FIFO_GT_HF                  (CANFD_MCR_TSSTAT_1)   /*!< STB FIFO More than half full */
#define CANFD_STB_FIFO_FULL                   (CANFD_MCR_TSSTAT_0 | CANFD_MCR_TSSTAT_1)   /*!< STB FIFO full */
/**
 * @}
 */

/**
 * @defgroup CANFD_fifo_type CANFD Transmit FIFO type
 * @{
 */
#define CANFD_TX_FIFO_PTB                     (0x0U)
#define CANFD_TX_FIFO_STB                     (0x1U)
/**
 * @}
 */

/**
 * @defgroup CANFD_STB_priority_mode CAN STB Priority Mode
 * @{
 */
#define CANFD_STB_PRIORITY_FIFO               (0x0U)                  /*!< Data first in and first be transmitted. */
#define CANFD_STB_PRIORITY_ID                 (CANFD_MCR_TSMODE)      /*!< Data with smallest ID first be transmitted. */
/**
 * @}
 */

/**
 * @defgroup CANFD_transmit_status CANFD Tx Frame status
 * @{
 */
#define CANFD_TRANSMIT_STATUS_IDLE               (0x00000000U)                  /*!< No transmission in progress. */
#define CANFD_TRANSMIT_STATUS_ONGOING            (0x00000001U)                  /*!< Transmission active without any issues. */
#define CANFD_TRANSMIT_STATUS_LOST_ARBITRATION   (0x00000002U)                  /*!< Arbitration lost. re-arbitration may take place with respect to REALIM. */
#define CANFD_TRANSMIT_STATUS_TRANSMITTED        (0x00000003U)                  /*!< Transmission successfully completed. */
#define CANFD_TRANSMIT_STATUS_ABORTED            (0x00000004U)                  /*!< Transmission aborted (TPA, TSA). */
#define CANFD_TRANSMIT_STATUS_DISTURBED          (0x00000005U)                  /*!< Transmission error. Retransmission may take place with respect to RETLIM. */
#define CANFD_TRANSMIT_STATUS_REJECTED           (0x00000006U)                  /*!< Misconfiguration of the frame format in the LLC frame. */
/**
 * @}
 */
 
/**
 * @defgroup CANFD_TT_trigger_type TTCAN Trigger Type
 * @{
 */
#define CANFD_TT_IMMEDIATE_TRIGGER        (0x0U)
#define CANFD_TT_RX_TIME_TRIG             (CANFD_TTCR_TTYPE_0)
#define CANFD_TT_TX_SINGLE_TRIG           (CANFD_TTCR_TTYPE_1)
#define CANFD_TT_TX_START_TRIG            (CANFD_TTCR_TTYPE_0 | CANFD_TTCR_TTYPE_1)
#define CANFD_TT_TX_STOP_TRIG             (CANFD_TTCR_TTYPE_2)
/**
 * @}
 */

/**
 * @defgroup CANFD_TTCAN_FIFO_mode TTCAN FIFO mode
 * @{
 */
#define CANFD_TT_FIFO_PTB_STB           (0x0U)
#define CANFD_TT_FIFO_MERGE             (CANFD_MCR_TTTBM)
/**
 * @}
 */

/**
 * @defgroup CANFD_TT_FIFO_INDEX TTCAN FIFO index
 * @{
 */
#define CANFD_TT_FIFO_SLOT0             (0x00000000U)
#define CANFD_TT_FIFO_SLOT1             (0x00000001U)
#define CANFD_TT_FIFO_SLOT2             (0x00000002U)
#define CANFD_TT_FIFO_SLOT3             (0x00000003U)
/**
 * @}
 */

/**
 * @defgroup CANFD_TT_FIFO_State_Set TTCAN FIFO State Set
 * @{
 */
#define CANFD_TT_FIFO_SLOT_SET_EMPTY    (CANFD_TTCR_TBE)
#define CANFD_TT_FIFO_SLOT_SET_FULL     (CANFD_TTCR_TBF)
/**
 * @}
 */
 
/** @defgroup CANFD_timestamp_prescaler CAN timestamp prescaler
  * @{
  */
#define CANFD_TT_PRESC_1                ((uint32_t)0x00000000U)                       /*!< Timestamp counter time unit in equal to CAN bit time                 */
#define CANFD_TT_PRESC_2                (CANFD_TTCR_T_PRESC_0)                        /*!< Timestamp counter time unit in equal to CAN bit time multiplied by 2  */
#define CANFD_TT_PRESC_4                (CANFD_TTCR_T_PRESC_1)                        /*!< Timestamp counter time unit in equal to CAN bit time multiplied by 4  */
#define CANFD_TT_PRESC_8                (CANFD_TTCR_T_PRESC_0 |CANFD_TTCR_T_PRESC_1)  /*!< Timestamp counter time unit in equal to CAN bit time multiplied by 8  */
/**
  * @}
  */

/** @defgroup CANFD_flags CANFD Flags
  * @{
  */
#define CANFD_FLAG_TX_STB_COMPLETE             CANFD_IFR_TSIF             /*!< STB Transmission Completed   */
#define CANFD_FLAG_TX_PTB_COMPLETE             CANFD_IFR_TPIF             /*!< PTB Transmission Completed   */
#define CANFD_FLAG_TX_ABORT_COMPLETE           CANFD_IFR_AIF              /*!< Transmission Cancellation Finished */
#define CANFD_FLAG_RX_COMPLETE                 CANFD_IFR_RIF              /*!< Rx Completed   */
#define CANFD_FLAG_RX_FIFO_ALMOST_FULL         CANFD_IFR_RAFIF            /*!< Rx FIFO almost full */
#define CANFD_FLAG_RX_FIFO_FULL                CANFD_IFR_RFIF             /*!< Rx FIFO full */
#define CANFD_FLAG_RX_FIFO_OVERFLOW            CANFD_IFR_ROIF             /*!< Overflow of CANFD Rx FIFO   */
#define CANFD_FLAG_ARB_LOST                    CANFD_IFR_ALIF             /*!< Arbitration lost detected   */
#define CANFD_FLAG_ERROR_PASSIVE               CANFD_IFR_EPIF             /*!< Error_Passive status changed  */
#define CANFD_FLAG_BUS_ERROR                   CANFD_IFR_BEIF             /*!< Bus_Off status changed       */
#define CANFD_FLAG_ERROR_TOGGLE                CANFD_IFR_EIF              /*!< Bus_Off status changed or Error_Passive status changed    */
#define CANFD_FLAG_TRIGGER_COMPLETE            CANFD_IFR_TTIF             /*!< Trigger Interrupt flag   */
#define CANFD_FLAG_TRIGGER_ERROR               CANFD_IFR_TEIF             /*!< Trigger error Interrupt flag   */
#define CANFD_FLAG_TIMESTAMP_WRAPAROUND        CANFD_IFR_WTIF             /*!< Timestamp counter wrapped around */

#define CANFD_FLAG_ALL_ERROR                   (CANFD_FLAG_RX_FIFO_OVERFLOW | CANFD_FLAG_ARB_LOST  |  \
                                                CANFD_FLAG_ERROR_PASSIVE    | CANFD_FLAG_BUS_ERROR |  \
                                                CANFD_FLAG_ERROR_TOGGLE     | CANFD_FLAG_TRIGGER_ERROR)
/**
  * @}
  */

/** @defgroup CANFD_interrupts CANFD Interrupts
  * @{
  */
#define CANFD_IT_TX_STB_COMPLETE           CANFD_IER_TSIE             /*!< STB Transmission Completed */
#define CANFD_IT_TX_PTB_COMPLETE           CANFD_IER_TPIE             /*!< PTB Transmission Completed */
#define CANFD_IT_ERROR_TOGGLE              CANFD_IER_EIE              /*!< Bus_Off status changed or Error_Passive status changed    */
#define CANFD_IT_RX_FIFO_ALMOST_FULL       CANFD_IER_RAFIE            /*!< Rx FIFO almost full */
#define CANFD_IT_RX_FIFO_FULL              CANFD_IER_RFIE             /*!< Rx FIFO full */
#define CANFD_IT_RX_FIFO_OVERFLOW          CANFD_IER_ROIE             /*!< Overflow of CANFD Rx FIFO   */
#define CANFD_IT_RX_COMPLETE               CANFD_IER_RIE              /*!< Rx Completed   */
#define CANFD_IT_ARB_LOST                  CANFD_IER_ALIE             /*!< Arbitration lost detected   */
#define CANFD_IT_ERROR_PASSIVE             CANFD_IER_EPIE             /*!< Error_Passive status changed  */
#define CANFD_IT_BUS_ERROR                 CANFD_IER_BEIE             /*!< Bus_Off status changed       */
#define CANFD_IT_TRIGGER_COMPLETE          CANFD_IER_TTIE             /*!< Trigger Interrupt flag   */
#define CANFD_IT_TIMESTAMP_WRAPAROUND      CANFD_IER_WTIE             /*!< Timestamp counter wrapped around */

#define CANFD_IT_ALL_ERROR                 (CANFD_IT_ERROR_TOGGLE | CANFD_IT_RX_FIFO_OVERFLOW | \
                                            CANFD_IT_ARB_LOST     | CANFD_IT_ERROR_PASSIVE    | \
                                            CANFD_IT_BUS_ERROR)
/**
  * @}
  */

/* Exported macro ------------------------------------------------------------*/
/** @defgroup CANFD_Exported_Macros CANFD Exported Macros
  * @{
  */

/**
  * @brief  Enable the specified CANFD interrupts.
  * @param  __HANDLE__ CANFD handle.
  * @param  __INTERRUPT__ CANFD interrupt.
  *         This parameter can be any combination of @arg CANFD_Interrupts
  * @retval None
  */
#define __HAL_CANFD_ENABLE_IT(__HANDLE__, __INTERRUPT__)             \
  (__HANDLE__)->Instance->IER |= (__INTERRUPT__)

/**
  * @brief  Disable the specified CANFD interrupts.
  * @param  __HANDLE__ CANFD handle.
  * @param  __INTERRUPT__ CANFD interrupt.
  *         This parameter can be any combination of @arg CANFD_Interrupts
  * @retval None
  */
#define __HAL_CANFD_DISABLE_IT(__HANDLE__, __INTERRUPT__)               \
  ((__HANDLE__)->Instance->IER) &= ~(__INTERRUPT__)
  
/** @brief  Check if the specified CANFD interrupt source is enabled or disabled.
  * @param  __HANDLE__ CANFD handle.
  * @param  __INTERRUPT__ specifies the CANFD interrupt source to check.
  *         This parameter can be a value of @arg CANFD_Interrupts
  * @retval ITStatus
  */
#define __HAL_CANFD_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER & (__INTERRUPT__))

/**
  * @brief  Check whether the specified CANFD flag is set or not.
  * @param  __HANDLE__ CANFD handle.
  * @param  __FLAG__ CANFD flag.
  *         This parameter can be one of @arg CANFD_flags
  * @retval FlagStatus
  */
#define __HAL_CANFD_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->IFR & (__FLAG__))

/**
  * @brief  Clear the specified CANFD flags.
  * @param  __HANDLE__ CANFD handle.
  * @param  __FLAG__ specifies the flags to clear.
  *         This parameter can be any combination of @arg CANFD_flags
  * @retval None
  */
#define __HAL_CANFD_CLEAR_FLAG(__HANDLE__, __FLAG__)             \
  ((__HANDLE__)->Instance->IFR) = (__FLAG__)

/** @brief  Return Rx FIFO fill level.
  * @param  __HANDLE__ CANFD handle.
  * @retval Rx FIFO fill level.
  */
#define __HAL_CANFD_GET_RX_FIFO_FILL_LEVEL(__HANDLE__) ((__HANDLE__)->Instance->MCR & CANFD_MCR_RSTAT)

/** @brief  Return STB FIFO free level.
  * @param  __HANDLE__ CANFD handle.
  * @retval STB FIFO free level.
  */
#define __HAL_CANFD_GET_STB_FIFO_FREE_LEVEL(__HANDLE__) ((__HANDLE__)->Instance->MCR & CANFD_MCR_TSSTAT)

/**
  * @brief  Enable canbus OFF.
  * @param  __HANDLE__ CANFD handle.
  * @retval None
  */
#define __HAL_CANFD_EnableCanBusOff(__HANDLE__)  (SET_BIT((__HANDLE__)->Instance->MCR, CANFD_MCR_BUSOFF))

/**
  * @brief  Disable canbus OFF.
  * @param  __HANDLE__ CANFD handle.
  * @retval None
  */
#define __HAL_CANFD_DisableCanBusOff(__HANDLE__)  (CLEAR_BIT((__HANDLE__)->Instance->MCR, CANFD_MCR_BUSOFF))
/**
  * @}
  */

/* Private macros ------------------------------------------------------------*/
/** @defgroup CNAFD_Private_Macros CANFD Private Macros
  * @{
  */

#define IS_CANFD_FRAME_FORMAT(FORMAT)   (((FORMAT) == CANFD_FRAME_CLASSIC) || \
                                         ((FORMAT) == CANFD_FRAME_FD_NO_BRS) || \
                                         ((FORMAT) == CANFD_FRAME_FD_BRS))
#define IS_CANFD_MODE(MODE)  (((MODE) == CANFD_MODE_NORMAL) || \
                              ((MODE) == CANFD_MODE_RESTRICTED_OPERATION) || \
                              ((MODE) == CANFD_MODE_LOOPBACK_EXT_NOACK) || \
                              ((MODE) == CANFD_MODE_LOOPBACK_EXT_ACK) || \
                              ((MODE) == CANFD_MODE_LOOPBACK_INT) || \
                              ((MODE) == CANFD_MODE_SILENT) || \
                              ((MODE) == CANFD_MODE_SILENT_LOOPBACK))
#define IS_CANFD_CANFD_PROTOCOL(PROTOCOL)  (((PROTOCOL) == CANFD_FD_BOSCH) || \
                                            ((PROTOCOL) == CANFD_FD_ISO_11898))
#define IS_CANFD_CKDIV(DIV)  (((DIV) >= 1U) && ((DIV) <= 32U))
#define IS_CANFD_NOMINAL_SJW(SJW)  (((SJW) >= 1U) && ((SJW) <= 128U))
#define IS_CANFD_NOMINAL_TSEG1(TSEG1)  (((TSEG1) >= 2U) && ((TSEG1) <= 513U))
#define IS_CANFD_NOMINAL_TSEG2(TSEG2)  (((TSEG2) >= 1U) && ((TSEG2) <= 128U))
#define IS_CANFD_DATA_SJW(SJW)  (((SJW) >= 1U) && ((SJW) <= 128U))
#define IS_CANFD_DATA_TSEG1(TSEG1)  (((TSEG1) >= 2U) && ((TSEG1) <= 257U))
#define IS_CANFD_DATA_TSEG2(TSEG2)  (((TSEG2) >= 1U) && ((TSEG2) <= 128U))
#define IS_CANFD_SSPOFF(SSPOFF)  (((SSPOFF) >= 0U) && ((SSPOFF) <= 255U))

#define IS_CANFD_ID_TYPE(TYPE)   (((TYPE) == CANFD_STANDARD_ID) || \
                                  ((TYPE) == CANFD_EXTENDED_ID))
#define IS_CANFD_FILTER_CHANNEL(CHANNEL)  (((CHANNEL) >= CANFD_FILTER_CHANNEL_0) && ((CHANNEL) <= CANFD_FILTER_CHANNEL_11))
#define IS_CANFD_RANK(RANK)   (((RANK) == CANFD_FILTER_RANK_CHANNEL_NUMBER) || \
                               ((RANK) == CANFD_FILTER_RANK_NONE))
#define IS_CANFD_FILTER_ID(ID)  (((ID) >= 0U) && ((ID) <= 0x1FFFFFFFU))
#define IS_CANFD_FILTER_FORMAT(FORMAT)  (((FORMAT) >= 0U) && ((FORMAT) <= 0x1F1707FFU))
#define IS_CANFD_MASK_ID(ID)  (((ID) >= 0U) && ((ID) <= 0x1FFFFFFFU))
#define IS_CANFD_MASK_FORMAT(FORMAT)  (((FORMAT) >= 0U) && ((FORMAT) <= 0x1F1707FFU))

#define IS_CANFD_MAX_VALUE(ID, VALUE)  (((ID) >= 0U) && ((ID) <= VALUE))
#define IS_CANFD_TX_FRAME_TYPE(TYPE)   (((TYPE) == CANFD_DATA_FRAME) || \
                                        ((TYPE) == CANFD_REMOTE_FRAME))
#define IS_CANFD_Handle(ID)  (((ID) >= 0U) && ((ID) <= 0xFFU))
#define IS_CANFD_DLC(DLC)  (((DLC) >= CANFD_DLC_BYTES_0U) && ((DLC) <= CANFD_DLC_BYTES_64))
#define IS_CANFD_TX_FIFO_TYPE(TYPE)   (((TYPE) == CANFD_TX_FIFO_PTB) || \
                                        ((TYPE) == CANFD_TX_FIFO_STB))

#define IS_CANFD_TRANSMIT_MODE(MODE)   (((MODE) == CANFD_TXFIFO_PTB_SEND) || \
                                        ((MODE) == CANFD_TXFIFO_STB_SEND_ONE) || \
                                        ((MODE) == CANFD_TXFIFO_STB_SEND_ALL))

#define IS_CANFD_REARBITRATION_LIMIT(LIMIT)  (((LIMIT) >= CANFD_AUTO_REARBITRATION_1TRANSFER) && \
                                              ((LIMIT) <= CANFD_AUTO_REARBITRATION_NO_LIMIT))

#define IS_CANFD_RETRANSMISSION_LIMIT(LIMIT)  (((LIMIT) >= CANFD_AUTO_RETRANSMISSION_1TRANSFER) && \
                                              ((LIMIT) <= CANFD_AUTO_RETRANSMISSION_NO_LIMIT))

#define IS_CANFD_STB_PRIORITY(PRIORITY)   (((PRIORITY) == CANFD_STB_PRIORITY_FIFO) || \
                                           ((PRIORITY) == CANFD_STB_PRIORITY_ID))

#define IS_CANFD_RX_FIFO_MODE(MODE)   (((MODE) == CANFD_RX_FIFO_OVERWRITE) || \
                                       ((MODE) == CANFD_RX_FIFO_BLOCKING))

#define IS_CANFD_RX_FIFO_THRESHOLD(THRESHOLD)   (((THRESHOLD) == CANFD_RX_FIFO_THRESHOLD_1SLOT) || \
                                                 ((THRESHOLD) == CANFD_RX_FIFO_THRESHOLD_2SLOTS) || \
                                                 ((THRESHOLD) == CANFD_RX_FIFO_THRESHOLD_3SLOTS))

#define IS_CANFD_TT_FIFO_MODE(MODE)   (((MODE) == CANFD_TT_FIFO_PTB_STB) || \
                                       ((MODE) == CANFD_TT_FIFO_MERGE))
#define IS_CANFD_TT_PRESCALER(PRESCALER)   (((PRESCALER) == CANFD_TT_PRESC_1) || \
                                            ((PRESCALER) == CANFD_TT_PRESC_2) ||\
                                            ((PRESCALER) == CANFD_TT_PRESC_4) ||\
                                            ((PRESCALER) == CANFD_TT_PRESC_8))
#define IS_CANFD_TX_ENABLE_WINDOW(WINDOW)  (((WINDOW) >= 1U) && ((WINDOW) <= 15U))
#define IS_CANFD_WATCH_TRIG_TIME(TIME)  (((TIME) >= 0U) && ((TIME) <= 0xFFFFU))
/**
  * @}
  */

/**
  * @}
  */
/* Exported functions --------------------------------------------------------*/
/** @addtogroup CANFD_Exported_Functions
  * @{
  */

/** @addtogroup CANFD_Exported_Functions_Group1 Initialization and de-initialization functions
  * @{
  */

/* Initialization/de-initialization functions  **********************************/
HAL_StatusTypeDef HAL_CANFD_Init(CANFD_HandleTypeDef *hcanfd);
void HAL_CANFD_MspInit(CANFD_HandleTypeDef *hcan);

/* Callbacks Register/UnRegister functions  ***********************************/
#if USE_HAL_CANFD_REGISTER_CALLBACKS == 1
HAL_StatusTypeDef HAL_CANFD_RegisterCallback(CANFD_HandleTypeDef *hcanfd, HAL_CANFD_CallbackIDTypeDef CallbackID, void (* pCallback)(CANFD_HandleTypeDef *_hCANFD));
#endif /* USE_HAL_CANFD_REGISTER_CALLBACKS */
/**
  * @}
  */

/** @addtogroup CANFD_Exported_Functions_Group2 IO operation functions
  * @{
  */

/* IO operation functions *******************************************************/
HAL_StatusTypeDef HAL_CANFD_ConfigFilter(CANFD_HandleTypeDef *hcanfd, CANFD_FilterTypeDef *sFilter);
HAL_StatusTypeDef HAL_CANFD_AddMessageToTxFifo(CANFD_HandleTypeDef *hcanfd, CANFD_TxHeaderTypeDef *pTxHeader, uint8_t *pData, uint32_t TxFifoType);
HAL_StatusTypeDef HAL_CANFD_ActivateTxRequest(CANFD_HandleTypeDef *hcanfd, uint32_t activeTxMode);
HAL_StatusTypeDef HAL_CANFD_GetRxMessage(CANFD_HandleTypeDef *hcanfd, CANFD_RxHeaderTypeDef *pRxHeader, uint8_t *pRxData);
HAL_StatusTypeDef HAL_CANFD_AbortTxRequest(CANFD_HandleTypeDef *hcanfd, uint32_t TransmitType);
HAL_StatusTypeDef HAL_CANFD_ConfigRearbitrationLimit(CANFD_HandleTypeDef *hcanfd, uint32_t reaLimit);
HAL_StatusTypeDef HAL_CANFD_ConfigRetransmissionLimit(CANFD_HandleTypeDef *hcanfd, uint32_t retLimit);
HAL_StatusTypeDef HAL_CANFD_ConfigTxFifoPriority(CANFD_HandleTypeDef *hcanfd, uint32_t StbPriority);
HAL_StatusTypeDef HAL_CANFD_ConfigRxFifoOverwrite(CANFD_HandleTypeDef *hcanfd, uint32_t OverflowMode);
HAL_StatusTypeDef HAL_CANFD_ConfigRxFifoThreshold(CANFD_HandleTypeDef *hcanfd, uint32_t Threshold);
HAL_StatusTypeDef HAL_CANFD_EnableReceiveErrorDataFrame(CANFD_HandleTypeDef *hcanfd);
HAL_StatusTypeDef HAL_CANFD_DisableReceiveErrorDataFrame(CANFD_HandleTypeDef *hcanfd);
HAL_StatusTypeDef HAL_CANFD_TT_Config(CANFD_HandleTypeDef *hcanfd, CANFD_TimeTriggerTypeDef *pTTConfig);
HAL_StatusTypeDef HAL_CANFD_TT_AddMessageToFifo(CANFD_HandleTypeDef *hcanfd, CANFD_TxHeaderTypeDef *txHeader, uint8_t *pData, uint32_t slotIndex);
HAL_StatusTypeDef HAL_CANFD_TT_ActivateTrigRequest(CANFD_HandleTypeDef *hcanfd, uint32_t triggerType, uint32_t trigTime, uint32_t slotIndex);
HAL_StatusTypeDef HAL_CANFD_TT_ConfigTxBufferState(CANFD_HandleTypeDef *hcanfd, uint32_t slotIndex, uint32_t slotState);
HAL_StatusTypeDef HAL_CANFD_Start(CANFD_HandleTypeDef *hcanfd);
HAL_StatusTypeDef HAL_CANFD_ActivateNotification(CANFD_HandleTypeDef *hcanfd, uint32_t activeITs);
HAL_StatusTypeDef HAL_CANFD_DeactivateNotification(CANFD_HandleTypeDef *hcanfd, uint32_t inactiveITs);
HAL_StatusTypeDef HAL_CANFD_EnterStandbyMode(CANFD_HandleTypeDef *hcanfd);
HAL_StatusTypeDef HAL_CANFD_ExitStandbyMode(CANFD_HandleTypeDef *hcanfd);
HAL_StatusTypeDef HAL_CANFD_GetProtocolStatus(CANFD_HandleTypeDef *hcanfd, CANFD_ProtocolStatusTypeDef *ProtocolStatus);
HAL_StatusTypeDef HAL_CANFD_GetTransmitStatus(CANFD_HandleTypeDef *hcanfd, CANFD_TxStatusTypeDef *TxStatus);
HAL_StatusTypeDef HAL_CANFD_Stop(CANFD_HandleTypeDef *hcanfd);

void HAL_CANFD_IRQHandler(CANFD_HandleTypeDef *hcanfd);
void HAL_CANFD_RxCpltCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_RxFifoAlmostFullCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_RxFifoFullCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_PtbTxCpltCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_StbTxCpltCallback(CANFD_HandleTypeDef *hcan, uint32_t LastSTBTxType);
void HAL_CANFD_RxFifoOverflowCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_ArbitrationLostCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_TxAbortCallback(CANFD_HandleTypeDef *hcan, uint32_t LastAbortTxType);
void HAL_CANFD_PassiveErrorCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_BusErrorCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_ErrorChangeCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_TT_RxTimeTrigCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_TT_TxSingleTrigCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_TT_TxStartTrigCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_TT_TxStopTrigCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_TT_TimestampWraparoundCallback(CANFD_HandleTypeDef *hcan);
void HAL_CANFD_TT_TrigErrorCallback(CANFD_HandleTypeDef *hcan);

#ifdef __cplusplus
}
#endif

#endif /* __PY32F4xx_HAL_CANFD_H */

/************************ (C) COPYRIGHT Puya *****END OF FILE****/
